#ifndef __THREADPOOL_H__
#define __THREADPOOL_H__
#include <atomic>
#include <vector>
#include <pthread.h>

#define LOGSTDERR(args...)

class CThreadPool
{
public:
    CThreadPool();
    ~CThreadPool();

public:
    /**
     * @brief 创建线程池
     * 
     * @param thread_num 线程池的大小 
     * @return true 创建成功 
     * @return false 创建失败
     */
    bool Create(int thread_num);

    /**
     * @brief 让线程池中所有线程退出
     * 
     */
    void StopAll();

    /**
     * @brief 调用一个线程来干活
     * 
     * @param recvMsgQueueCnt 接受消息队列中任务的数量
     */
    void Call(int recvMsgQueueCnt);

private:
    /**
     * @brief 新线程的回调函数，也就是创建线程后马上执行的第一个函数，或者叫线程入口函数
     * 
     * @param threadData  
     * @return void* 
     */
    static void* ThreadFunc(void *threadData);

private:
    /**
     * @brief 线程池中的线程结构体，方便扩展功能
     * 
     */
    struct ThreadItem
    {
        pthread_t       _Handle;    //线程句柄
        CThreadPool*    _pThis;     //记录线程池的指针
        bool            isRunning; //线程池运行标志，true表示线程池正在运行，才允许调用StopAll()
        ThreadItem(CThreadPool* pthis):
            _pThis(pthis), isRunning(false) {}
        ~ThreadItem() {}
    };

private:
    static pthread_mutex_t      m_pthreadMutex; 
    static pthread_cond_t       m_pthreadCond;
    static bool                 m_shutdown;     //线程退出标志
    int                         m_iThreadNum;   //线程池中要创建的线程数量
    std::atomic<int>            m_iRunningThreadNum; //运行中的线程数量，通过atomic保证原子操作
    time_t                      m_iLastEmgTime; //用来记录上一次发生emergency事件的时间
    time_t                      m_iPrintInfoTime; //打印信息的间隔时间
    time_t                      m_iCurTime; //当前时间
    std::vector<ThreadItem *>   m_threadVector;

private:
    //禁止拷贝
    CThreadPool(CThreadPool &&) = delete;
    CThreadPool(const CThreadPool &) = delete;
    CThreadPool &operator=(CThreadPool &&) = delete;
    CThreadPool &operator=(const CThreadPool &) = delete;
    
};

#endif
